const ws = require("ws");
const log = require("../utils/log.js");

var global_session_list = {};
var global_seesion_key = 1;

var netbus = {};

// 有客户端的session接入进来
function on_session_enter(session) {
	
    log.info("session enter", session._socket.remoteAddress, session._socket.remotePort);
    
	session.last_pkg = null; // 表示我们存储的上一次没有处理完的TCP包;	
	

	// 加入到我们的serssion 列表里面
	global_session_list[global_seesion_key] = session;
	session.session_key = global_seesion_key;
	global_seesion_key ++;
	// end 
}

function on_session_exit(session) {
	log.info("session exit !!!!");
	session.last_pkg = null; 
	if (global_session_list[session.session_key]) {
		global_session_list[session.session_key] = null;
		delete global_session_list[session.session_key]; // 把这个key, value从 {}里面删除
		session.session_key = null;
	}
}

// 一定能够保证是一个整包;
// 如果是json协议 str_or_buf json字符串;
// 如果是buf协议 str_or_buf Buffer对象;
function on_session_recv_cmd(session, str_or_buf) {
	log.info(str_or_buf);
}

// 发送命令
function session_send(session, cmd) {	
	session.send(cmd);	
}

// 关闭一个session
function session_close(session) {	
	session.close();	
}

// -------------------------
function isString(obj){ //判断对象是否是字符串  
	return Object.prototype.toString.call(obj) === "[object String]";  
}  

function ws_add_client_session_event(session) {
	//用户进入
	on_session_enter(session,true); 

	// close事件
	session.on("close", function() {
		on_session_exit(session);
	});

	// error事件
	session.on("error", function(err) {
	});
	// end 

	//接受信息
	session.on("message", function(data) {	
		log.info("message:",data);	
        if (!isString(data)) {
            session_close(session);
            return;
        }
        on_session_recv_cmd(session, data);		
	});
	// end

	
}

function start_ws_server(ip, port) {
	log.info("start ws server:", ip, port);
	var server = new ws.Server({
		host: ip,
		port: port,
	});

	server.on("connection", (client_sock)=>{
		ws_add_client_session_event(client_sock);
	});

	server.on("error", (errorr)=>{
		log.error("ws server listen error!!");
	});

	server.on("close",(error)=>{
		log.error("ws server listen close!!");
	});	
}

netbus.start_ws_server = start_ws_server;
module.exports = netbus;